﻿using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml.Linq;
using Atendex.Infraestrutura.Repositórios;
using Atendex.Dominio.Interfaces;
using Atendex.Containex;

namespace Atendex.Web
{
    public partial class EditarAreasNegocio : System.Web.UI.Page
    {
        private readonly RepositorioUnidadeNegocio repUnidadeNegocio = new RepositorioUnidadeNegocio();

        private bool Editando
        {
            get
            {
                bool? editando = (bool?)ViewState["editando"];
                if (editando == null || editando == false)
                    return false;
                return true;
            }
            set
            {
                ViewState["editando"] = value;
                if (value)
                {
                    lblLegend.Text = "Editar Área de Negócio";
                    btnLimpar.Text = "Cancelar";
                    btnExcluir.Visible = true;
                }
                else
                {
                    lblLegend.Text = "Nova Área de Negócio";
                    btnLimpar.Text = "Limpar";
                    btnExcluir.Visible = false;
                }
            }
        }
        private IUnidadeNegocio ObjetoEditado
        {
            get
            {
                return (IUnidadeNegocio)ViewState["objeto_editado"];
            }
            set
            {
                ViewState["objeto_editado"] = value;
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            AtualizaGrid();
        }

        private void AtualizaGrid()
        {
            IUnidadeNegocio[] areas = repUnidadeNegocio.ObtemTodos();
            gridAreas.DataSource = areas;
            gridAreas.DataBind();
            ViewState["objetos"] = areas;
        }

        private void CarregarObjeto(IUnidadeNegocio area)
        {
            txtNome.Text = area.Nome;
            txtEmail.Text = area.Responsavel.Email;
            lblLegend.Text = "Editar Área de Negócio";
            this.ObjetoEditado = area;
            this.Editando = true;
        }

        protected void gridAreas_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            // commandargument parece vir sempre com o índice da linha que teve
            // o botão apertado
            int i = int.Parse((string)e.CommandArgument);
            IUnidadeNegocio area = ((IUnidadeNegocio[])ViewState["objetos"])[i];
            CarregarObjeto(area);
        }

        protected void btnLimpar_Click(object sender, EventArgs e)
        {
            LimparCampos();
            this.Editando = false;
        }

        protected void btnSalvar_Click(object sender, EventArgs e)
        {
            if(!this.Editando)
                SalvarNovoObjeto();
            else
                AtualizarObjeto();
            
            AtualizaGrid();
        }

        private void AtualizarObjeto()
        {
            IUnidadeNegocio area = this.ObjetoEditado;
            area.Nome = txtNome.Text;
            area.Responsavel.Email = txtEmail.Text;
            try
            {
                repUnidadeNegocio.Salvar(area);
                ShowMensagem("A área de negócios foi atualizada.");
                LimparCampos();
                this.Editando = false;
            }
            catch (RepositorioException ex)
            {
                ShowMensagem("Houve um erro ao atualizar a área de negócios: " + ex.Message);
            }
        }

        private void SalvarNovoObjeto()
        {
            try
            {
                IUnidadeNegocio area = Container.CriarUnidadeNegocio(txtNome.Text,
                    Container.CriarResponsavel(txtNome.Text, txtEmail.Text));
                repUnidadeNegocio.Salvar(area);
                ShowMensagem("Área de negócio cadastrada com sucesso.");
                LimparCampos();
            }
            catch (RepositorioException ex)
            {
                ShowMensagem("Houve um erro ao salvar: " + ex.Message);
            }
        }

        private void LimparCampos()
        {
            txtNome.Text = "";
            txtEmail.Text = "";
        }

        private void ShowMensagem(string mensagem)
        {
            lblMensagem.Text = mensagem;
            lblMensagem.Visible = true;
        }

        protected void btnExcluir_Click(object sender, EventArgs e)
        {
            try
            {
                IUnidadeNegocio un = ObjetoEditado;
                un.Ativa = false;
                repUnidadeNegocio.Salvar(un);
                ShowMensagem("A unidade de negócios foi excluída.");
                LimparCampos();
                this.Editando = false;
                AtualizaGrid();
            }
            catch (RepositorioException ex)
            {
                ShowMensagem("Houve um erro ao excluir: " + ex.Message);
            }
        }
    }
}
